package com.gin.no_gay_alliance.utils;

import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.util.Log;

import com.gin.nga.enums.NgaDomain;
import com.gin.nga.enums.NgaPhpApi;
import com.gin.nga.response.ReplyLocation;
import com.gin.no_gay_alliance.activity.TopicListActivity;
import com.gin.no_gay_alliance.activity.TopicReadActivity;
import com.gin.no_gay_alliance.activity.UserCenterActivity;
import com.gin.no_gay_alliance.app.MyApplication;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.regex.Matcher;

/**
 * URL工具类
 *
 * @author : ginstone
 * @version : v1.0.0
 * @since : 2023/8/26 00:28
 **/
public class UrlUtils {
    public static final String TAG = UrlUtils.class.getSimpleName();

    /**
     * 将url的query部分解析为map
     *
     * @param url url或query
     * @return 参数map
     */
    public static HashMap<String, List<String>> parseQuery(String url) {
        HashMap<String, List<String>> res = new HashMap<>();
        // 移除path部分
        if (url.contains("?")) {
            url = url.substring(url.indexOf("?") + 1);
        }
        // 移除hash部分
        if (url.contains("#")) {
            Matcher matcher = ReplyLocation.REPLY_PATTERN.matcher(url);
            if (matcher.find()) {
                ArrayList<String> l = new ArrayList<>();
                l.add(matcher.group(1));
                res.put("pid", l);
            }
            url = url.substring(0, url.indexOf("#"));
        }
        String[] params = url.split("&");
        for (String param : params) {
            String[] kv = param.split("=");
            String key = kv[0];
            String value = kv.length == 2 ? kv[1] : null;

            List<String> list = res.get(key);
            list = list != null ? list : new ArrayList<>();
            list.add(value);
            res.put(key, list);
        }
        return res;
    }

    /**
     * 判断url是否为用户中心
     *
     * @param url url
     * @return 是否为用户中心链接
     */
    public static boolean isUserCenter(String url) {
        System.out.println("url = " + url);
        return url.contains(NgaPhpApi.nuke.path) && url.contains("func=ucp") && (url.contains("uid=") || url.contains("username="));
    }

    /**
     * 判断链接是否为nga站内链接
     *
     * @param url url
     * @return 是否为站内链接
     */
    public static boolean isNgaUrl(String url) {
        url = url.replace("http:", "https:");
        for (NgaDomain ngaDomain : NgaDomain.values()) {
            if (url.startsWith(ngaDomain.domain)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 判断链接是否为回复列表链接
     *
     * @param url url
     * @return 是否为回复列表链接
     */
    public static boolean isReadUrl(String url) {
        return url.contains(NgaPhpApi.read.path);
    }

    /**
     * 判断链接是否为主题列表链接
     *
     * @param url url
     * @return 是否为主题列表链接
     */
    public static boolean isThreadUrl(String url) {
        return url.contains(NgaPhpApi.thread.path);
    }

    /**
     * 判断链接是否可以由本APP打开
     *
     * @param url url
     * @return 是否可以打开
     */
    public static boolean isOpenableUrl(String url) {
        return isNgaUrl(url) && (isReadUrl(url) || isThreadUrl(url) || isUserCenter(url));
    }

    /**
     * 对于可打开的链接，使用本APP的对应Activity打开
     *
     * @param url     url
     * @param context 上下文
     */
    public static void openUrl(String url, Context context) {
        if (!isOpenableUrl(url)) {
            MyApplication.app.handler.toast("本APP无法打开该链接: " + url);
            return;
        }
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setData(Uri.parse(url));

        if (isReadUrl(url)) {
            Log.d(TAG, "跳转到主题内: " + url);
            intent.setClass(context, TopicReadActivity.class);
            context.startActivity(intent);
        } else if (isThreadUrl(url)) {
            Log.d(TAG, "跳转到主题列表: " + url);
            TopicListActivity.startActivity(context, url);
        } else if (isUserCenter(url)) {
            Log.d(TAG, "跳转到用户中心: " + url);
            // 跳转到用户中心
            intent.setClass(context, UserCenterActivity.class);
            context.startActivity(intent);
        } else {
            MyApplication.app.handler.toast("本APP无法打开该链接: " + url);
        }
    }

    /**
     * 使用默认浏览器打开一个链接
     *
     * @param url     url
     * @param context 上下文
     */
    public static void openUrlWithBrowser(String url, Context context) {
        Log.d(TAG, "浏览器打开: " + url);
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setData(Uri.parse(url));
        context.startActivity(intent);
    }
}
